package com.station.Activitys.fragment;


import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.DatePicker;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.scwang.smartrefresh.header.MaterialHeader;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import com.station.Activitys.R;
import com.station.Activitys.activity.ApplyChangeActivity;
import com.station.Activitys.activity.ChangeSubmitActivity;
import com.station.Activitys.activity.MapStationActivity;
import com.station.Activitys.activity.PlanSubmitActivity;
import com.station.Activitys.activity.SurveyNotRoomActivity;
import com.station.Activitys.activity.SurveyRoomActivity;
import com.station.Activitys.activity.SurveySubmitActivity;
import com.station.Activitys.activity.WorkDetailsActivity;
import com.station.Activitys.adapter.WorkAdapter;
import com.station.Activitys.adapter.base.BaseRecyclerViewAdapter;
import com.station.Activitys.bean.Survey;
import com.station.Activitys.fragment.base.BaseFragment;
import com.station.Activitys.http.manager.WorkManager;
import com.station.Activitys.utils.CacheManger;
import com.station.Activitys.utils.Constant;
import com.station.Activitys.utils.DateUtils;
import com.station.Activitys.utils.JumperUtils;
import com.station.Activitys.utils.StringUtils;
import com.station.Activitys.utils.ToastUtils;
import com.zhy.autolayout.AutoFrameLayout;
import com.zhy.autolayout.AutoLinearLayout;
import com.zhy.autolayout.AutoRelativeLayout;

import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;

/**
 * 项目名称：车管所 手机app
 * 类描述：设计院 工单处理 fragment
 * 创建人：张飞祥
 * 创建时间：2018/7/19 9:18
 * 修改人：张飞祥
 * 修改时间：2018/7/19 9:18
 * 修改备注：
 */
public class WorkFragment extends BaseFragment implements TabLayout.OnTabSelectedListener {

    //标题
    @Bind(R.id.tv_title) TextView tvTitle;
    //类别标题
    @Bind(R.id.layout_tab_type) TabLayout layoutTabType;
    //单选管理 布局
    @Bind(R.id.rg_work_layout) RadioGroup rgWorkLayout;
    //单选按钮 本月
    @Bind(R.id.rb_work_this_month) RadioButton rbWorkThisMonth;
    //单选按钮 上月
    @Bind(R.id.rb_work_lase_month) RadioButton rbWorkLaseMonth;
    //开始时间
    @Bind(R.id.tv_start_time) TextView tvStartTime;
    //结束时间
    @Bind(R.id.tv_stop_time) TextView tvStopTime;
    //查询按钮
    @Bind(R.id.tv_work_search) TextView tvWorkSearch;

    //TODO 刷新
    //刷新主体控制器
    @Bind(R.id.layout_refresh) SmartRefreshLayout layoutRefresh;
    //下拉刷新
    @Bind(R.id.header_material) MaterialHeader headerMaterial;
    //列表视图
    @Bind(R.id.rv_list) RecyclerView rvList;
    //悬浮功能按钮
    @Bind(R.id.btn_map) FloatingActionButton btnMap;

    //TODO 无数据视图
    //无数据总布局
    @Bind(R.id.layout_not) AutoRelativeLayout layoutNot;
    //无数据图片
    @Bind(R.id.iv_not_data) ImageView ivNotData;
    //无数据文字
    @Bind(R.id.tv_not_data) TextView tvNotData;

    /**
     * 弹出层 筛选
     */
    //背景 遮罩
    @Bind(R.id.layout_work_mask) AutoFrameLayout layoutWorkMask;
    //筛选主体布局
    @Bind(R.id.layout_work_screen) AutoLinearLayout layoutWorkScreen;
    //标题栏 遮罩控制按钮
    @Bind(R.id.layout_screen) AutoLinearLayout layoutScreen;
    //筛选 角标
    @Bind(R.id.iv_screen) ImageView ivScreen;

    //标题类别数据
    private String[] mStrType = {"全部", "勘察", "规划", "可研", "变更"};
    //筛选内容 展开 flag
    private boolean mScreenFlag = true;
    //适配器
    private WorkAdapter mAdapter = null;
    //数据源
    private List<Survey> mWorkList = null;
    //用户 id
    private int mUserId;

    //TODO http 变量
    //获取系统时间
    private Calendar mCal;
    //年月日
    private int mYear, mMonth, mDay;
    //开始与结束时间
    private String mStartDate, mStopDate;
    //当前 工单类别
    private String mWorkType = "";
    //请求哪一页
    private int mIndex = 1;
    //每页几条
    private int mPageCount = 10;
    //上拉加载数据粘性 flag
    public boolean mFootFlag = true;
    //上拉加载 没有数据 page 是否 +1
    private boolean mPullPageFlag = true;

    //TODO 初始化网络请求
    public WorkManager mApiManager;

    @Override
    protected void initViews() {
        //设置标题
        tvTitle.setText("工单处理");
        //显示遮罩按钮
        layoutScreen.setVisibility(View.VISIBLE);
        //显示悬浮功能按钮
        btnMap.setVisibility(View.VISIBLE);

        //TODO 循环添加 Tab
        for (String type : mStrType) {
            layoutTabType.addTab(layoutTabType.newTab().setText(type));
        }
        //设置下拉刷新小圆圈 颜色
        headerMaterial.setColorSchemeColors(getResources().getColor(R.color.colorPrimary));
        //设置遮罩层 不可点击
        layoutWorkMask.setOnClickListener(null);

        //网络请求接口 常驻方法
        mApiManager = mApiManager.getWorkApiManager(getActivity(), getActivity().getTaskId());
        //获取 用户 id
        mUserId = CacheManger.getUserId(mACache);

        //TODO 初始化参数
        //工单类别
        mWorkType = "";
        //开始时间
        mStartDate = "";
        //结束时间
        mStopDate = "";
        //初始化 开始时间
        tvStartTime.setText("----/--/--");
        //初始化 结束时间
        tvStopTime.setText("----/--/--");

        //TODO 添加 tabLayout 监听事件
        layoutTabType.addOnTabSelectedListener(this);

        //初始化 配置数据
        initData();
    }

    private void initData() {
        //获取当前系统时间
        getSystemDate();

        //TODO 下拉刷新
        initPullRefresh();
        //TODO 自动刷新
        layoutRefresh.autoRefresh();
        //TODO 上拉加载
        initLoadMoreListener();
    }

    /**
     * 按钮点击事件
     *
     * @return
     */
    @OnClick({R.id.layout_screen, R.id.rb_work_this_month, R.id.rb_work_lase_month,
            R.id.tv_start_time, R.id.tv_stop_time, R.id.tv_work_search, R.id.btn_map})
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.layout_screen:        //标题栏 遮罩控制按钮
                if (mScreenFlag)
                    isShowScreen();
                else
                    isNotShowScreen();
                break;

            case R.id.rb_work_this_month:   //本月
                setThisMonthSearch();
                break;

            case R.id.rb_work_lase_month:   //上月
                setLaseMonthSearch();
                break;

            case R.id.tv_start_time:        //时间段 --->  开始时间
                setStartData();
                break;

            case R.id.tv_stop_time:         //时间段 --->  结束时间
                setStopData();
                break;

            case R.id.tv_work_search:       //时间栏 重置按钮
                setSearchAllHttp();
                break;

            case R.id.btn_map:              //基站分布地图
                JumperUtils.JumpTo(getActivity(), MapStationActivity.class);
                break;
        }
    }

    /**
     * 重置 搜索全部 网络请求事件
     */
    private void setSearchAllHttp() {
        //TODO 初始化参数
        //取消 单选按钮选中状态
        rgWorkLayout.clearCheck();
        //开始时间
        mStartDate = "";
        //结束时间
        mStopDate = "";
        //初始化 开始时间
        tvStartTime.setText("----/--/--");
        //初始化 结束时间
        tvStopTime.setText("----/--/--");
        //收起弹窗
        isNotShowScreen();
        //清空 adapter
        if (mAdapter != null) {
            mAdapter.clearDataAll();
        }
        //TODO 开始网络请求
        layoutRefresh.autoRefresh();
    }

    /**
     * 本月 查询
     */
    private void setThisMonthSearch() {
        //TODO 初始化参数
        //开始时间
        mStartDate = DateUtils.getThisStartDate();
        //结束时间
        mStopDate = DateUtils.getThisStopDate();

        //初始化 开始时间
        tvStartTime.setText("----/--/--");
        //初始化 结束时间
        tvStopTime.setText("----/--/--");
        //收起弹窗
        isNotShowScreen();
        //自动刷新 视图
        layoutRefresh.autoRefresh();
    }

    /**
     * 上月 查询
     */
    private void setLaseMonthSearch() {
        //TODO 初始化参数
        //开始时间
        mStartDate = DateUtils.getLaseStartDate();
        //结束时间
        mStopDate = DateUtils.getLaseStopDate();

        //初始化 开始时间
        tvStartTime.setText("----/--/--");
        //初始化 结束时间
        tvStopTime.setText("----/--/--");
        //收起弹窗
        isNotShowScreen();
        //自动刷新 视图
        layoutRefresh.autoRefresh();
    }

    /**
     * 设置 开始 日期
     */
    public void setStartData() {
        //TODO 日期选择控件
        Dialog dateDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                //TODO 获取日期
                String strData = year + "/" + (++month < 10 ? "0" + month : month) + "/" + (day < 10 ? "0" + day : day);
                //TODO 设置开始日期
                mStartDate = strData + " 00:00:00";
                //TODO 设置结束日期
                mStopDate = tvStopTime.getText().toString() + " 23:59:59";

                /**
                 * 销售记录 网络请求 判断
                 *
                 * 1.判断 开始时间 是否 <= 结束时间
                 *      true： 在判断 结束时间 是否 为 初始值 "----/--/--（格式：2018/07/05）"
                 *          --->true： 开始 调用网络请求
                 *          --->false：什么也不做
                 *
                 *      false：弹出 相应的 提示
                 */
                if (!StringUtils.compareDate(mStartDate, mStopDate)) {
                    //添加开始日期 到控件上
                    tvStartTime.setText(strData);
                    if (!mStopDate.equals("----/--/--") && !mStopDate.equals("----/--/-- 23:59:59")) {
                        //收起弹窗
                        isNotShowScreen();
                        if (mAdapter != null) {
                            mAdapter.clearDataAll();
                        }
                        //取消 单选按钮选中状态
                        rgWorkLayout.clearCheck();
                        //自动刷新
                        layoutRefresh.autoRefresh();
                    }
                } else {
                    ToastUtils.showShort(getActivity(), "起始时间不能大于结束时间哦！");
                }
            }
        }, mYear, mMonth, mDay);
        //弹出时间选择器
        dateDialog.show();
    }

    /**
     * 设置 结束 日期
     */

    public void setStopData() {
        //TODO 日期选择控件
        Dialog dateDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                //TODO 获取日期
                String strData = year + "/" + (++month < 10 ? "0" + month : month) + "/" + (day < 10 ? "0" + day : day);
                //TODO 设置结束日期
                mStopDate = strData + " 23:59:59";
                //TODO 设置开始日期
                mStartDate = tvStartTime.getText().toString() + " 00:00:00";

                /**
                 * 销售记录 网络请求 判断
                 *
                 * 1.判断 结束时间 是否 >= 开始时间
                 *      true： 在判断 结束时间 是否 为 初始值 "----/--/--（格式：2018/07/05）"
                 *          --->true： 开始调用网络请求
                 *          --->false：什么也不做
                 *
                 *      false：弹出 相应的 提示
                 */
                if (!StringUtils.compareDate(mStartDate, mStopDate)) {
                    //添加结束日期 到控件上
                    tvStopTime.setText(strData);
                    if (!mStartDate.equals("----/--/--") && !mStartDate.equals("----/--/-- 00:00:00")) {
                        //收起弹窗
                        isNotShowScreen();
                        if (mAdapter != null) {
                            mAdapter.clearDataAll();
                        }
                        //取消 单选按钮选中状态
                        rgWorkLayout.clearCheck();
                        //自动刷新
                        layoutRefresh.autoRefresh();
                    }
                } else {
                    ToastUtils.showShort(getActivity(), "结束时间不能小于起始时间哦！");
                }
            }
        }, mYear, mMonth, mDay);
        //弹出时间选择器
        dateDialog.show();
    }

    /**
     * http 初始化 工单处理列表 刷新 网络请求
     */
    private void initHttp() {
        //清空列表
        if (mWorkList != null && mWorkList.size() > 0)
            mWorkList.clear();
        //清空adapter
        if (mAdapter != null)
            mAdapter.clearAll();

        //初始化全局 list
        mWorkList = new ArrayList<>();
        //设置 为 首次加载
        mApiManager.getType(Constant.FIRST_LOAD);
        //初始化 上拉加载  page 允许 +1
        mPullPageFlag = true;
        //初始化页数
        mIndex = 1;
        //TODO 开始网络请求
        mApiManager.workList(mUserId, "", mWorkType, mStartDate, mStopDate, mIndex, mPageCount);
    }

    /**
     * 上拉加载数据
     */
    private void initLoadMoreListener() {
        layoutRefresh.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(RefreshLayout refreshlayout) {
                //设置文字上拉加载更多
                mApiManager.getType(Constant.PULLUP_LOAD_MORE);
                //如果 为 true 可以 查看下一页
                if (mPullPageFlag) {
                    //数据请求
                    mIndex = mIndex + 1;
                }
                //初始化 上拉加载数据 粘性 flag
                mFootFlag = true;
                //TODO 上拉加载 网络请求
                mApiManager.workList(mUserId, "", mWorkType, mStartDate, mStopDate, mIndex, mPageCount);
            }
        });
    }

    /**
     * 下拉刷新操作
     */
    private void initPullRefresh() {

        layoutRefresh.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(RefreshLayout refreshlayout) {
                //TODO 开始刷新
                initHttp();
            }
        });
    }


    /**
     * 工单处理列表 报错
     */
    @Subscriber(tag = Constant.BUS_WORK_LIST_ERROR, mode = ThreadMode.MAIN)
    public void initMyReleaseError(String httpError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //TODO View 非空判断
                if (layoutRefresh != null) {
                    //结束刷新
                    layoutRefresh.finishRefresh(false);
                    //结束加载
                    layoutRefresh.finishLoadMore(false);
                    //隐藏数据列表控件
                    rvList.setVisibility(View.GONE);
                    //显示无数据控件
                    layoutNot.setVisibility(View.VISIBLE);
                    //设置图片
                    ivNotData.setImageResource(R.drawable.img_not_network);
                    //设置文字
                    tvNotData.setText("无网络连接");
                }
            }
        }, 1000);
    }


    /**
     * 工单处理列表  首次数据加载
     */
    @Subscriber(tag = Constant.BUS_WORK_LIST, mode = ThreadMode.MAIN)
    public void initMyRelease(final List<Survey> list) {

        //开启延时操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //TODO View 非空判断
                if (rvList != null) {
                    if (list != null && list.size() != 0) {

                        //设置 工单处理列表 数据
                        mWorkList.addAll(list);
                        //设置 通讯供求 适配器
                        mAdapter = new WorkAdapter(getActivity(), list) {
                            @Override
                            public void getItemDetails(int position) {
                                //传递数据 到 工单详情页面
                                Bundle bundle = new Bundle();
                                bundle.putSerializable(Constant.INTENT_SURVEY_BEAN, mWorkList.get(position));
                                JumperUtils.JumpTo(getActivity(), WorkDetailsActivity.class, bundle);
                            }
                        };

                        //添加 适配器 样式
                        rvList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
                        //添加 适配器
                        rvList.setAdapter(mAdapter);

                        //TODO item 点击事件
                        mAdapter.setOnItemClickListener(new BaseRecyclerViewAdapter.OnRecyclerViewItemClickListener() {
                            @Override
                            public void onItemClick(View view, int position) {
                                //勘察状态
                                String state = mWorkList.get(position).getState();
                                //站型
                                String model = mWorkList.get(position).getStationModel();
                                //基站实体
                                Survey survey = mWorkList.get(position);
                                //传递数据
                                Bundle bundle = new Bundle();
                                //当前数据 实体对象
                                bundle.putSerializable(Constant.INTENT_SURVEY_BEAN, survey);

                                /**
                                 *  1.待勘察，      | 未通过勘察初审                    进入基站信息提交页面
                                 *
                                 *  2.待勘察初审    | 待规划初审                        进入基站信息详情
                                 *    待可研审核    | 待变更审核
                                 *
                                 *  3.通过勘察初审  | 未通过规划初审                     进入申请规划页面
                                 *
                                 *  4.通过规划初审  | 未通过可研审核                     进入申请可研页面
                                 *
                                 *  5.通过可研审核  | 未通过变更审核                     进入申请变更页面
                                 *    完成变更
                                 *
                                 *  6.通过变更审核  |                                   进入提交变更页面
                                 */
                                if (state.equals(Constant.STATION_SURVEY_STAY) || state.equals(Constant.STATION_SURVEY_NO_FIRST)) {
                                    if (model.equals(Constant.STATION_TYPE_NO_ROOM))
                                        JumperUtils.JumpTo(getActivity(), SurveyRoomActivity.class, bundle);
                                    else
                                        JumperUtils.JumpTo(getActivity(), SurveyNotRoomActivity.class, bundle);

                                } else if (state.equals(Constant.STATION_SURVEY_STAY_FIRST) ||
                                        state.equals(Constant.STATION_PLAN_STAY_FIRST) ||
                                        state.equals(Constant.STATION_PLAN_STAY_TRIAL) ||
                                        state.equals(Constant.STATION_CHANGE_STAY_TRIAL)) {
                                    JumperUtils.JumpTo(getActivity(), WorkDetailsActivity.class, bundle);

                                } else if (state.equals(Constant.STATION_SURVEY_YES_FIRST) || state.equals(Constant.STATION_PLAN_NO_FIRST)) {
                                    JumperUtils.JumpTo(getActivity(), SurveySubmitActivity.class, bundle);

                                } else if (state.equals(Constant.STATION_PLAN_YES_FIRST) || state.equals(Constant.STATION_PLAN_NO_STUDY)) {
                                    JumperUtils.JumpTo(getActivity(), PlanSubmitActivity.class, bundle);

                                } else if (state.equals(Constant.STATION_PLAN_YES_STUDY) ||
                                        state.equals(Constant.STATION_CHANGE_NO_STUDY) ||
                                        state.equals(Constant.STATION_CHANGE_COMPLETE)) {
                                    JumperUtils.JumpTo(getActivity(), ApplyChangeActivity.class, bundle);

                                } else if (state.equals(Constant.STATION_CHANGE_YES_STUDY)) {
                                    JumperUtils.JumpTo(getActivity(), ChangeSubmitActivity.class, bundle);
                                }
                            }
                        });
                        //显示数据列表控件
                        rvList.setVisibility(View.VISIBLE);
                        //隐藏无数据控件
                        layoutNot.setVisibility(View.GONE);
                    } else {
                        //隐藏数据列表控件
                        rvList.setVisibility(View.GONE);
                        //显示无数据控件
                        layoutNot.setVisibility(View.VISIBLE);
                    }
                    //隐藏加载小圆圈
                    layoutRefresh.finishRefresh();
                }
            }
        }, 1000);
    }

    /**
     * 工单处理列表  上拉加载数据
     */
    @Subscriber(tag = Constant.BUS_WORK_LIST_FOOT)
    public void initMyReleaseFoot(List<Survey> list) {
        final List<Survey> footList = list;

        //开启延时操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //TODO View 非空判断
                if (layoutRefresh != null) {
                    /**
                     * 判断是否有数据
                     * 当 返回列表 数据 size 0 没有更多数据可加载了
                     */
                    if (footList.size() == 0) {
                        //page 不允许 + 1
                        mPullPageFlag = false;
                        //显示提示
                        ToastUtils.showShort(getActivity(), "没有更多数据了");
                    } else {
                        //page 允许 + 1
                        mPullPageFlag = true;
                        if (mAdapter != null & mFootFlag == true) {
                            //填充上拉加载数据，加载到adapter里面
                            mWorkList.addAll(footList);
                            //加载到adapter里面
                            mAdapter.addFooterItem(footList);
                            //关闭 上拉加载 粘性数据
                            mFootFlag = false;
                        }
                        //显示提示
                        ToastUtils.showShort(getActivity(), "更新了 " + footList.size() + " 条目数据");
                    }
                    //结束加载
                    layoutRefresh.finishLoadMore();
                }
            }
        }, 1000);
    }

    /**
     * 基站 工单处理列表 刷新
     */
    @Subscriber(tag = Constant.BUS_WORK_PUSH)
    public void initPush(String push) {
        //自动刷新
        layoutRefresh.autoRefresh();
    }

    /**
     * 显示 筛选 视图
     */
    private void isShowScreen() {
        //角标状态
        ivScreen.setSelected(true);
        //筛选 flag
        mScreenFlag = false;
        //遮罩层
        layoutWorkMask.setVisibility(View.VISIBLE);
        //筛选层
        layoutWorkScreen.setVisibility(View.VISIBLE);
        /**
         * 设置 进入动画
         */
        Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.push_top_in);
        layoutWorkScreen.startAnimation(animation);

    }

    /**
     * 隐藏 筛选 视图
     */
    private void isNotShowScreen() {
        //角标状态
        ivScreen.setSelected(false);
        //筛选 flag
        mScreenFlag = true;
        /**
         * 设置 退出动画
         */
        Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.push_top_out);
        layoutWorkScreen.startAnimation(animation);
        //筛选层
        layoutWorkScreen.setVisibility(View.GONE);
        //遮罩层
        layoutWorkMask.setVisibility(View.GONE);
    }

    /**
     * 获取当前系统日期
     */
    private void getSystemDate() {
        mCal = Calendar.getInstance();
        mYear = mCal.get(Calendar.YEAR);       //获取年月日时分秒
        mMonth = mCal.get(Calendar.MONTH);     //获取到的月份是从0开始计数
        mDay = mCal.get(Calendar.DAY_OF_MONTH);
    }

    @Override
    protected int getContentViewId() {
        return R.layout.frg_work;
    }


    /**
     * tabLayout  点击事件
     *
     * @param tab
     */
    @Override
    public void onTabSelected(TabLayout.Tab tab) {

        //获取当前 tab
        String tabStr = tab.getText().toString();
        //逻辑判断 赋值
        if (tabStr.equals("全部"))
            mWorkType = "";
        else
            mWorkType = tabStr;

        if (!mScreenFlag)
            //收起弹窗
            isNotShowScreen();
        //自动刷新 视图
        layoutRefresh.autoRefresh();
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
    }
}
